/**
 * axios 封装
 */
import axios from "axios";
import {
  getTokenLocal,
  removeTokenLocal,
  removeUserLocal
} from "@/utils/auth.js";
import {
  showLoadingToast,
  showDialog
} from 'vant';
import router from '@/router';

// 配置信息
const config = {
  withCredentials: true, // send cookies when cross-domain requests
  baseURL: import.meta.env.VITE_APIDomainName, // http://www.zjff495.cn:5050
  timeout: 5000 // 设定响应超时
};

// 创建一个 axios 实例
const service = axios.create(config);

let toast = null;

// 请求拦截器逻辑封装
const requestInterceptorSuccess = (config) => {
  const token = getTokenLocal();
  if (token) {
    config.headers.satoken = token; // token的名字参见接口文档
  }

  // 在发送请求之前做些什么  
  toast = showLoadingToast({
    message: '加载中...',
    forbidClick: true,
  }); // 显示loading
  return config;
};

const requestInterceptorError = (error) => {
  toast && toast.close(); // 隐藏loading
  return Promise.reject(error);
};

// 响应拦截器逻辑封装
const responseInterceptorSuccess = (response) => {
  toast && toast.close(); // 隐藏loading
  const result = response.data; // 注意后端返回的数据格式 result = { code msg data }
  // 处理成功
  if (result.code === 200) { // 注意返回的code值的含义
    return Promise.resolve(result); // 返回成功  
  }
  // 处理Token错,需要重新登录
  if (result.code === 401) {
    // 显示登录提示对话框
    return new Promise((resolve, reject) => {
      showDialog({
        title: "用户需要登录！",
        message: result.msg,
        confirmButtonText: "去登录",
        cancelButtonText: "取消"
      }).then(() => {
        // 用户点击"去登录"，执行登出和跳转
        removeTokenLocal();
        removeUserLocal();
        
        // 跳转到登录页面
        router.push({
          name: 'login',
          query: { redirect: router.currentRoute.value.fullPath }
        });
        
        // 拒绝Promise
        reject(new Error(result.msg || "Token错,需要重新登录"));
      }).catch(() => {
        // 用户点击"取消"，不做任何操作
        reject(new Error(result.msg || "Token错,需要重新登录"));
      });
    });
  }
  // 处理其他错误
  showDialog({
    title: "响应错误",
    message: result.msg
  });
  return Promise.reject(new Error(result.msg || "未知的响应错误"));
};

const responseInterceptorError = (error) => {
  console.error("响应出错:" + error); // 控制台错误提示  
  toast && toast.close(); // 隐藏loading

  let errorMessage = '未知错误';
  if (axios.isCancel(error)) {
    errorMessage = '请求被取消';
  } else if (error.code === 'ECONNABORTED') {
    errorMessage = '请求超时，请稍后重试';
  } else if (error.response) {
    errorMessage = `请求失败，状态码: ${error.response.status}`;
  }

  showDialog({ // 全局错误提示
    title: "响应拦截器错误",
    message: errorMessage
  });
  return Promise.reject(error);
};

// 添加请求拦截器
service.interceptors.request.use(requestInterceptorSuccess, requestInterceptorError);

// 添加响应拦截器
service.interceptors.response.use(responseInterceptorSuccess, responseInterceptorError);

// 默认引出
export default service;
